package jmine.tec.services.api.factory;

import java.util.Set;

import jmine.tec.di.scope.TypedScope;
import jmine.tec.services.api.ActionsEnum;
import jmine.tec.services.api.Service;
import jmine.tec.utils.register.Receiver;
import bancosys.tec.persist.controller.PersistenceEnabledController;

/**
 * Interface que define os metodos que as fabricas de servicos devem implementar.
 * 
 * @author Rafael Volpato (Dec 13, 2007)
 */
public interface ServiceFactory extends Receiver<Class<?>> {

    /**
     * Retorna uma nova instancia do servico desejado com as serviceProperties e controller injetados.
     * 
     * @param action acao
     * @param serviceName nome do servico
     * @param typedScope propriedades do servico
     * @return uma instancia do servico.
     * @throws ServiceCreationException Se o servico não for encontrado ou se não for possivel instanciar o servico.
     */
    Service<? extends PersistenceEnabledController> getService(ActionsEnum action, String serviceName, TypedScope typedScope)
            throws ServiceCreationException;

    /**
     * Retorna uma nova instancia do servico responsavel por incluir uma nova instancia de um objeto da targetClass com as serviceProperties
     * e controller injetados.
     * 
     * @param targetClass classe alvo de manipulacao do servico
     * @param typedScope propriedades do servico
     * @return uma instancia do servico
     * @throws ServiceCreationException Se o servico não for encontrado ou se não for possivel instanciar o servico
     */
    Service<? extends PersistenceEnabledController> getService(Class<?> targetClass, TypedScope typedScope) throws ServiceCreationException;

    /**
     * Retorna um set contendo todos os serviços que foram registrados na {@link ServiceFactory}.
     * 
     * @return set de serviços disponiveis.
     */
    Set<String> getServices();
}
